/**
给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
输入：l1 = [2,4,3], l2 = [5,6,4]
输出：[7,0,8]
解释：342 + 465 = 807.
 */
function addTwoNumbers(l1, l2) {
  let head = new ListNode(0)
  let curr = head
  let add = 0
  while(l1||l2||add!==0) {
    let x = l1 ? l1.val : 0
    let y = l2 ? l2.val : 0
    let sum = x + y + add
    add = Math.floor(sum/10)
    curr.next = new ListNode(sum%10)
    curr = curr.next
    // 更新指针，避免无限循环
    l1 = l1 ? l1.next : null
    l2 = l2 ? l2.next : null
  }
  return head.next
}
const l1 = [2,4,3]
const l2 = [5,6,4]
console.log(addTwoNumbers(l1, l2))
/**
 * idea: 模拟加法
 * 1. 从最低位开始相加，如果相加结果大于10，则进位
 * 2. 如果有一个链表已经遍历完，则将另一个链表的剩余部分直接拼接到结果链表的末尾
 * 3. 如果最后有进位，则将进位拼接到结果链表的末尾
 */